package handledb;

import javax.servlet.ServletRequestListener;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;

public interface JdbcTemplate extends Connection, ServletRequestListener {
    public static JdbcTemplate create(DbPool dbPool){
        return new HandleDb(dbPool);
    }
    public static JdbcTemplate create(PoolConfig config){
        return new HandleDb(new DbPool(config));
    }
    public <E> E queryToObject(String sql, Class c, Object... params);

    public <E> E queryToObject(E obj);

    public <E> List<E> queryToList(String sql, Class c, Object... params);

    public <E> List<E> queryToList(E obj);

    public <E> List<E> queryToList(E obj, int pageNo, int pageSize);

    public String queryJson(String sql, Object... params);

    public String queryToJson(String sql, Class c, Object... params);

    public <T> String queryToJson(T t);

    public int updateBySql(String sql, Object... params);

    public <E> int update(E e);

    public <E> int delete(E e);

    public <E> int create(E e);

    public <E> int countByObject(E e);

    public void commit() throws SQLException;

    public void rollback() throws SQLException;

    public void commitGlobal() throws SQLException;

    public void rollbackGlobal() throws SQLException;

    public void close();

    public void commitAndColse();

    public void rollbackAndColse();

    public ResultMap queryToMap(String sql, Object... params);

    public String queryToString(String sql, Object... params);

    public List<String> queryToListStr(String sql, Object... params);

    public int queryToInt(String sql, Object... objects);

    public int countBySql(String sql, Object... params);


    /**
     * 设定查询的字段 字段以,为分隔符   与query开头的配合使用
     *
     * @param fields
     * @return
     */
    public JdbcTemplate selectFields(String fields);

    /**
     * 设定不需要查询的字段  字段以,为分隔符  与query开头的配合使用
     *
     * @param fields
     * @return
     */
    public JdbcTemplate unSelectFields(String fields);

    public JdbcTemplate updateFields(String[] fields);

    /**
     * 设定需要跟新的字段  字段以,为分隔符  与update create配合使用
     *
     * @param fields
     * @return
     */
    public JdbcTemplate updateFields(String fields);

    public JdbcTemplate notUpdateFields(String[] fields);

    /**
     * 设定不跟新的字段  字段以,为分隔符  与update create配合使用
     *
     * @param fields
     * @return
     */
    public JdbcTemplate notUpdateFields(String fields);

    public JdbcTemplate whereFields(String fields);

    /**
     * 判断实体类字段是否为空  判断的字段以,为分隔符
     *
     * @param obj
     * @param fieldNames
     * @param <E>
     * @return
     */
    public <E> JdbcTemplate fieldHasEmpty(E obj, String fieldNames);

    /**
     * 打开一个手动控制的事务
     * 返回事务ID用于使用该事务和关闭该事务，长时间不操作会被强制回退并关闭
     *
     * @return 事务ID
     */
    public long openTransaction();

    /**
     * 打开一个手动控制的事务
     * 返回事务ID用于使用该事务和关闭该事务，长时间不操作，超过失效时间后会被强制回退并关闭
     *
     * @param failureTime 事务失效时间
     * @return 事务ID
     */
    public long openTransaction(long failureTime);

    /**
     * 获取一个事务的有效时间
     *
     * @param transactionId
     * @return 返回时间  如果事务不存在 则返回0
     */
    public long getValidTime(long transactionId);

    /**
     * 使用事务 当前线程的数据库连接就是使用的该事务
     *
     * @param id 使用某一个打开的事务
     */
    public void useTransaction(Long id);

    /**
     * 关闭事务 当前线程的数据库连接会关闭该当前的连接并重新开一个连接来使用
     *
     * @param id
     */
    public void closeTransaction(Long id);

    /**
     *  关闭事务 当前线程的数据库连接会关闭该当前的连接并重新开一个连接来使用
     */
    public void closeTransaction();

    /**
     * 模板语句跟新
     *
     * @param tempSql
     * @param t
     * @param <T>
     * @return
     */
    public <T> int templateUpdate(String tempSql, T t);

    /**
     * 模板语句查询一条数据
     *
     * @param tempSql
     * @param t
     * @param <T>
     * @return
     */
    public <T> T templateQueryOne(String tempSql, T t);

    public <T, M> T templateQueryOne(String tempSql, M m, Class c);

    /**
     * 模板语句查询列表
     *
     * @param tempSql
     * @param t
     * @param <T>
     * @return
     */
    public <T> List<T> templateQueryAll(String tempSql, T t);

    public <T, M> List<T> templateQueryAll(String tempSql, M m, Class c);

    /**
     * 模板分页查询
     *
     * @param tempSql
     * @param t
     * @param pageNo
     * @param pageSize
     * @param <T>
     * @return
     */
    public <T> List<T> templateQueryAll(String tempSql, T t, int pageNo, int pageSize);

    public <T, M> List<T> templateQueryAll(String tempSql, M m, Class c, int pageNo, int pageSize);

    /**
     * 模板语句统计条数
     *
     * @param tempSql
     * @param t
     * @param <T>
     * @return
     */
    public <T> int templateCount(String tempSql, T t);

    /**
     * 模板sql解析组装
     *
     * @param tempSql
     * @param t
     * @param params
     * @param <T>
     * @return
     */
    public <T> String templateResolver(String tempSql, T t, List<Object> params);
}
